/*
 * @Author: your name
 * @Date: 2022-01-08 09:33:05
 * @LastEditTime: 2022-01-08 10:27:11
 * @LastEditors: Please set LastEditors
 * @Description: 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 * @FilePath: /hs_cms/utility/db/async-db2.js
 */
// 1.导包
const mysql = require('mysql');
// 2. 封装数据库工具类
// eg: let myDB = new DB(dbName);
class DB {
  // 2.1 实现构造方法
  constructor(dataBaseName){
    console.log('DB 初始化, DB name:', dataBaseName);
    // 2.1.1 实现数据库初始化 连接池
    this.connection = mysql.createPool({
      // connectionLimit: 10,
      host: '127.0.0.1',
      port: 3306,
      user: 'root',
      password: '123456',
      database: dataBaseName,
      charset: 'utf8'
    });
    // 2.1.2 异常情况的状态
    this.common = [
      {message: '服务器出现问题', status: 500},
      {message: '无法访问资源', status: 404},
    ];
  }
  // 2.2 实现功能函数
  // 2.2.1 查询功能
  /**
   * @description: 用来进行数据库的查询功能可带数据的查询条件
   * @param {*} names 要查询的字段名称， 用 , 隔开 eg:  name, age, nname
   * @param {*} tableName 要查询的表名
   * @param {*} options 查询条件, 字符串形式， eg ' where id = 1'
   * @return {*} 返回Promise
   */ 
  select(names, tableName, options) {
    let self = this;
    return new Promise((resolve, reject) => {
      // 2.2.1.1 获取连接
      self.connection.getConnection(function (err, conn){
        if (err) {
          console.log(err);
          reject(self.common[0]);
        } else {
          // 2.2.1.2 操作数据库
          // select name, age, nname from table where id = 2;
          let sql = `select ${names.toString()} from ${tableName} ${options}`;
          console.log(sql);
          conn.query(sql, (err, rows) =>{
            if (err) {
              reject(self.common[1]);
            }
            conn.release();
            resolve({
              status: 200,
              msg: '数据查询成功',
              data: rows
            });
          });
        }
      })
    }).catch(err => console.log(err));
  }
  /**
   * @description: 数据库的增加数据的功能
   * @param {*} tableName  指定表名
   * @param {*} names 出入字段的字段名，多个字段用 ， 逗号隔开
   * @param {*} value 插入的字段值，多个字段用 ，逗号隔开，注意字符串类型要加上引号
   * @return 返回一个 Promise对象
   */
  insert(tableName, names, values){
    let self = this;
    return new Promise((resolve, reject) => {
      self.connection.getConnection(function(err, conn){
        if (err) {
          console.log(err);
          reject(self.common[0]);
        } else {
          let sql = `insert into ${tableName} (${names}) values (${values})`;
          console.log(sql);
          conn.query(sql, (err, rows) => {
            if (err) {
              console.log(err);
              reject(self.common[1]);
            }
            conn.release();
            resolve({
              status: 200,
              message: '插入数据成功',
              data: rows
            })
          });
        }
      });
    }).catch(err => { console.log(err) });
  }

  /**
   * description: 使用update 更新数据库的某一条数据的一个列值
   * @param {*} tableName 表名
   * @param {*} name 列名
   * @param {*} value 修改的值
   * @param {*} option 特殊条件 要带 where
   */
  update(tableName, name, value, option){
    let self = this;
    return new Promise((resolve, reject) => {
      // 异步任务
      self.connection.getConnection((err, conn) => {
        if (err) {
          console.log(err);
          reject(self.common[0]);
        } else {
          // update tablename set colname = newvalue where id = 2;
          let sql = `update ${tableName} set ${name} = ${value} ${option}`;
          conn.query(sql, (err, result) => {
            if (err) {
              console.log(err);
              reject(self.common[1]);
            }
            conn.release();
            resolve({
              status: 200,
              message: '修改成功',
              data: result
            });
          });
        }
      });
    }).catch(err => console.log(err));
  }

  /**
   * description: 删除指定表中的某一条数据
   * @param {*} tableName 删除字段所在的表名
   * @param {*} option 特殊条件 要带 where
   */
  delete(tableName, option){
    let self = this;
    return new Promise((resolve, reject) => {
      self.connection.getConnection((err, conn) => {
        if (err) {
          console.log(err);
          reject(self.common[0]);
        } else {
          // delete from tablename where id = 2;
          let sql = `delete from ${tableName} ${option}`;
          conn.query(sql, (err, result) => {
            if (err) {
              console.log(err);
              reject(self.common[1]);
            }
            conn.release();
            resolve({
              status: 200,
              message: '删除成功',
              data: result
            })
          });
        }
      });
    }).catch(err => console.log(err));
  }

}

module.exports = DB;
